#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include"linkstack.h"  
#include"../linkqueue/queue.h"

int compute_pre(char *arr);

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("请输入前缀表达式作为参数\n");
        return -1;
    }
    int ans = compute_pre(argv[1]);
    printf("%d \n", ans);
    return 0;
}

int compute_pre(char *arr) {
	if (arr == NULL || *arr == '\0') {  // 处理空表达式
        printf("表达式为空\n");
        return -1;
    }

    stack_t *s = NULL;
    stack_init(&s, sizeof(int));  // 符号不入栈 直接int
    int len = strlen(arr);
    for (int i = len - 1; i >= 0; i--) {  // 从右向左扫描前缀表达式（遇到运算符就计算！！1）
        if (arr[i] >= '0' && arr[i] <= '9') {  // 遇到数字，转换为int后入栈
            int num = arr[i] - '0';
            stack_push(s, &num);
        } else {  // 遇到运算符，弹出两个操作数计算
           
            int left, right;  // 左操作数、右操作数
            stack_pop(s, &left);   // 第一个弹出的是左操作数    逆序入栈，后入栈的是左操作数
            stack_pop(s, &right);  // 第二个弹出的是右操作数

            int res;//记录当前两个操作数的计算结果
            switch (arr[i]) {
                case '+':
                    res = left + right;
                    break;
                case '-':
                    res = left - right;
                    break;
                case 'x': 
                    res = left * right;
                    break;
                case '/':
                    if (right == 0) { 
                        printf("除零错误\n");
                        stack_destroy(&s);
                        return -1;
                    }
                    res = left / right;
                    break;
                default:  // 无效运算符
                    printf("无效运算符: %c\n", arr[i]);
                    stack_destroy(&s);
                    return -1;
            }
            stack_push(s, &res);  // 运算结果入栈
        }
    }

    int ans;
	stack_pop(s, &ans);
   
    stack_destroy(&s);  // 销毁栈，释放资源
    return ans;
}
